import axios from "axios";
import { Message } from "element-ui";
import store from "@/store/index.js";
import { getRouteToken, removeRouteToken } from "@/utils/auth";

// 请求超时时间，10s
const requestTimeOut = 10 * 1000;
const success = 200;
// 提示信息显示时长
const messageDuration = 5 * 1000;

// 系统全局请求对象
const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: requestTimeOut,
  responseType: "json",
  validateStatus(status) {
    return status === success;
  },
});

request.interceptors.request.use(
  (config) => {
    try {
      const token = getRouteToken();
      if (token) {
        config.headers["Authorization"] = "bearer " + token;
      }
    } catch (e) {
      console.error(e);
    }
    return config;
  },
  (error) => {
    console.log(error);
    return Promise.reject(error);
  }
);

request.interceptors.response.use(
  (config) => {
    return config;
  },
  (error) => {
    if (error.response) {
      const errorMessage =
        error.response.data === null
          ? "系统内部异常，请联系网站管理员"
          : error.response.data.message;
      switch (error.response.status) {
        case 404:
          Message({
            message: "很抱歉，资源未找到",
            type: "error",
            duration: messageDuration,
          });
          break;
        case 403:
          Message({
            message: "很抱歉，当前网关用户暂无该操作权限",
            type: "error",
            duration: messageDuration,
          });
          break;
        case 401:
          remove();
          Message({
            message: "网关认证已失效，请重新认证",
            type: "error",
            duration: messageDuration,
          });
          break;
        default:
          Message({
            message: errorMessage,
            type: "error",
            duration: messageDuration,
          });
          break;
      }
    }
    return Promise.reject(error);
  }
);

const r = {
  post(url, params) {
    return request.post(url, params, {
      transformRequest: [
        (params) => {
          return tansParams(params);
        },
      ],
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
    });
  },
  put(url, params) {
    return request.put(url, params, {
      transformRequest: [
        (params) => {
          return tansParams(params);
        },
      ],
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
    });
  },
  get(url, params) {
    let _params;
    if (Object.is(params, undefined)) {
      _params = "";
    } else {
      _params = "?";
      for (const key in params) {
        // eslint-disable-next-line no-prototype-builtins
        if (params.hasOwnProperty(key) && params[key] !== null) {
          _params += `${key}=${params[key]}&`;
        }
      }
    }
    return request.get(`${url}${_params}`);
  },
  delete(url, params) {
    let _params;
    if (Object.is(params, undefined)) {
      _params = "";
    } else {
      _params = "?";
      for (const key in params) {
        // eslint-disable-next-line no-prototype-builtins
        if (params.hasOwnProperty(key) && params[key] !== null) {
          _params += `${key}=${params[key]}&`;
        }
      }
    }
    return request.delete(`${url}${_params}`);
  },
};

function tansParams(params) {
  let result = "";
  Object.keys(params).forEach((key) => {
    if (!Object.is(params[key], undefined) && !Object.is(params[key], null)) {
      result +=
        encodeURIComponent(key) + "=" + encodeURIComponent(params[key]) + "&";
    }
  });
  return result;
}

function remove() {
  removeRouteToken();
  store.commit("account/setRouteToken", null);
}

export default r;
